# 小蓝做实验
# 2025/2/27
import math
import time


def get_primes_count():
    """
    由于大部分数据都在10^8以内, 且生成10^12以内的时间过长, 所以首先使用埃氏筛法生成10^8以内的所有质数
    逐条筛查数据:
        如果数据在10^8以内, 则判断是否是质数
        如果数据大于10^8次方, 则认为是误差数据, 添加进错误列表error_nums
    逐条遍历error_nums中的数据:
        如果数据可以被10^8以内的任意质数整除, 则该数不为质数, 直接跳出循环
        如果不可以被任意质数整除, 则该数为质数
    :return:
    """

    def sieve():
        primes = set()
        num = 1e8
        is_prime = [True] * (int(num) + 1)
        is_prime[0] = is_prime[1] = False
        for i in range(2, int(math.sqrt(num)) + 1):
            if is_prime[i]:
                for j in range(i * i, int(num) + 1, i):
                    is_prime[j] = False
        for i, prime in enumerate(is_prime):
            if prime:
                primes.add(i)
        return primes

    primes = sieve()
    error_nums = []
    count = 0
    with open("../../data/2022_a.txt", "r") as file:
        line = file.readline()
        # 首先统计10^8以内的质数
        while line and line != "\n":
            num = int(line)
            if num <= 10e8:
                if num in primes:
                    count += 1
            else:
                error_nums.append(num)
            line = file.readline()

    # 判断误差数据: 如果这个数不能被10^8以内的任意质数整除则为质数
    for error_num in error_nums:
        flag = True
        for prime in primes:
            if error_num % prime == 0:
                flag = False
                break
        if flag:
            count += 1
    return count


if __name__ == '__main__':
    print(get_primes_count())  # 342693

